package com.atguigu.bigdata.spark.core.rdd.operator.transform

import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}

/**
  * create by undeRdoG on  2021-06-08  14:26
  * 凡心所向，素履以往，生如逆旅，一苇以航。
  */
object Spark17_RDD_Operator_Transform {

  def main(args: Array[String]): Unit = {
    val sparkConf = new SparkConf().setAppName("Operator").setMaster("local[*]")
    val sc = new SparkContext(sparkConf)


    val rdd = sc.makeRDD(List(("a", 1), ("b", 2), ("a", 3), ("a", 4)),2)

    /**
      * aggregateByKey 存在函数柯化，有两个参数列表：
      * 第一个参数列表：传递一个参数，表示初始值，只要用于碰见第一个 Key 的时候， 和 value 进行分区内计算
      * 第二个参数列表：传递两个参数
      * 第一个参数表示分区内的计算规则
      * 第二个参数表示分区间的计算规则
      **/

      rdd.aggregateByKey(Int.MinValue)(
        //分区内取最大数
        (x,y) => {math.max(x,y)},
        // 分区间求和
        (x,y) => {x + y}
      ).collect().foreach(println)

    /**
      * aggregateByKey 可以指定 分区内和分区间不同的计算规则，
      * 而 ReduceByKey  无法分开指明，只能用与分区内计算规则 和分区间计算规则相同的场景
      **/

  }
}
